星期一過渡一下,就是可能很多老司機都很熟了,
但個人覺得很重要的SSH
SSH有很多種用途,這裡只講用來SSH作遠端連線的那個
常常會看到一組3個檔案的東西,Google了很久才找到,順便分享一下:
ca.pem # 認證機構憑證
(如果是自簽的,那CA就是自己啦,ca.pem就是ca簽的憑證,理論上應該也拿ca的public key)
cert.pem # 用戶公錀憑證
key.pem # 用戶私錀憑證
設定 PRIVATE_KEY_FILE
這邊參考:
為什麼打這一篇,因為我覺得加密、憑證是非常重要的,在就像車子的主備動安全配備(ABS、ACC、AEB、BSM)
不管你是再怎麼會開車的老司機,還是要繫上安全帶一樣。
有完整的安全設定都可能被駭客利用已知漏洞attack了,更何況遑論沒設定憑證,就像脫光光在裸奔
先講求不傷身體,再講求藥效。
一般我們都會先求讓服務先起來,再加安全性
若有機會重新建置時,說不定可以先把一堆憑證什麼的都納進來,再從hello world開始開發
指令幾乎都是參考網路文章的,中文的部分是個人註解,希望能幫助到大家理解。
如果解理有誤也請指教,避免誤導更多人。
為什麼建詳SSH用非對稱金鑰的方式來驗證?
因為打個8~16碼的密碼,相對來說是不安全,所以ssh建議關掉密碼驗證
而based on PKCS的數位簽章相對是較難偽造及暴力破解的
(mac也有ssh-agent,windows直接放生)
不過實務上通常會用ubuntu來管理,所以mac的部份請自行參考網路教學
http://wjp2013.github.io/tool/ssh-agent/
$ ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -P "" # no passphrase 保哥的方式
# -P passphrase
# -C comment 會在id_rsa.pub,不給的話id_rsa.pub會放 account@domain 不知道有沒有什麼效力
# -f krl_file
沒給passphrase會問你,所以自動化要-P
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Enter a file in which to save the key (/c/Users/you/.ssh/id_rsa)
Enter passphrase (empty for no passphrase): [Type a passphrase]
# 輸入密碼短語(安全密碼)
Enter same passphrase again: [Type passphrase again]
$ touch ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
id_rsa.pub 大概會長這樣
ssh-rsa AAAAB3NzaC1ASGWE1234234asf+klqjwrgSFGBW322...Q3GNuDON4+Q== your_email@example.com
$ ls ~/.ssh/
authorized_keys # 授權的key,裡面放的是 允許遠端連到「這一台電腦」的public key
id_rsa # private key,所以如果ansible要連managed node的話,ansible.cfg的private_key_file要指來這裡
id_rsa.pub # public key
當我們要跟遠端Server驗證時,要用我們的private key來驗證,我們的private key可能會有很多把,
「我猜」private key應該放在一個安全的地方,不是任何程式都能存取,每次要用的話要打passphrase才行。
當我們要進行驗證時,讓ssh-agent來當「代理人」,拿相對應的private key來跟「遠端服務」作驗證。
當我們授權ssh-agent幫我們做苦力後,即可免除user整天打passphrase的麻煩。
參考:
(1)https://help.github.com/articles/working-with-ssh-key-passphrases/
在~/.bash_profile或~/.bashrc中加入
SSH_ENV="$HOME/.ssh/environment"
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add;
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
#ps ${SSH_AGENT_PID} doesn't work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
手動執行
# start the ssh-agent in the background
eval $(ssh-agent -s) # 把 ssh-agent 的輸出交給 eval 執行
Agent pid 59566
Ubuntu的ssh-agent預設應該是自動執行的
$ echo $SSH_AGENT_PID
$ echo $SSH_AUTH_SOCK
# 2個指令都有值就代表有啟動
macOS可能只有$SSH_AUTH_SOCK有值
$ ssh-add ~/.ssh/id_rsa # 把 private key 加到 ssh-agent
# 如果有設passphrase,ssh-add時要輸入passphrase
macOS Sierra 10.12.2以後,修改~/.ssh/config
自動把private key讀到ssh-agent,以及把passphrases存到keychain
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
# =======分隔線======
$ ssh-add -K ~/.ssh/id_rsa # -K 是 Apple's standard version of ssh-add
依據爬文的結果,mac沒有ssh agent(這點可能有錯喔),用這一篇試看看
https://gist.github.com/atl/4525323
少有一個最小的工作.ssh/config文件
# persistently add default keys to Keychain
# 持續添加默認鍵鑰匙扣
$ ssh-add -K
# prepend ForwardAgent to existing ssh_config, meaning `ssh -A` is the effective default
# 將 ForwardAgent添加到現有的ssh_config,這意味著`ssh -A`是有效的默認值
$ echo "ForwardAgent yes" | cat - ~/.ssh/config > /tmp/out && mv /tmp/out ~/.ssh/config
參考:will保哥,我的 Windows Subsystem for Linux (WSL) 終極開發人員配置 - 2018 版
$ cat ~/.ssh/id_rsa.pub | ssh user@remoteip tee -a ~/.ssh/authorized_keys
# cat ~/.ssh/id_rsa.pub 本地端的public key
# 透過 ssh 加到 遠端 ~/.ssh/authorized_keys,所以authorized_keys裡面放的是允許連線的public_key
# 透過 tee 把終端的內容加到檔案中
# 把local端產生的public key 加到 遠端電腦的~/.ssh/authorized_keys
不用把private key放到中間server(remote1)
這個部分就請自行參考原文囉
SSH 免除重複輸入金鑰密碼教學:SSH Agent 與 Forwarding
https://blog.gtwang.org/linux/using-ssh-agent-forwarding-to-avoid-being-asked-passphrase/
不好意思,今天先過度一下,
有些部分其實是我自己猜測的,尤其是macOS的部分,若有錯誤再麻煩高手指教
完蛋,文章快用完了,匯報一下進度
依照這種進度,可能撐不了30天了,
預告未來幾天會再回到docker image的介紹:
gitlab、gitlab-ci、gitlab-ci-runner
jenkins只是順便介紹的,其實個人喜歡的是gitlab
因為作為市占率老二的gitlab,
它可以自架在內網(相較於github),
UI看起來又令人感覺它很「年輕」